﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Comissoes.Models;
using Comissoes.JQGridObject;

namespace Comissoes.Controllers
{
    public class OperadoresController : AppController
    {
        private xcontEntities db = new xcontEntities();

        public ActionResult Index()
        {
            return View();
        }

        public JsonResult OperadoresLookupList()
        {
            return Json((from c in db.OPERADORES.Include("PESSOAS").ToList() where c.PESSOAS.NOME_PESSOA.ToUpper().Contains(Request["term"].ToUpper()) select new { value = c.ID_OPER, label = c.PESSOAS.NOME_PESSOA }).Take(10), JsonRequestBehavior.AllowGet);
        }

        // Monta a lista de tipos de produtos
        public JsonResult OperadoresList(String sidx, String sord, Int32 page, Int32 rows, Boolean _search, String searchField, String searchOper, String searchString)
        {
            var q = from c in db.OPERADORES
                    select new
                    {
                        c.ID_OPER,
                        c.COD_OPER,
                        NOME_PESSOA = c.PESSOAS.NOME_PESSOA,
                        ID_PERF = c.PERFIS.DESC_PERF,
                        ATIVO_OPER = c.ATIVO_OPER.Equals("A") ? "Sim" : "Não"
                    };

            JQGridBuilder jbuilder = new JQGridBuilder(q, page, sidx, sord, searchField, searchString, searchOper, "ID_OPER", _search, rows);

            return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
        }

        public ActionResult Details(int id)
        {
            if (Request.IsAjaxRequest())
                return Json(db.OPERADORES.First(t => t.ID_OPER == id).PESSOAS.NOME_PESSOA, JsonRequestBehavior.AllowGet);

            OPERADORES operador = db.OPERADORES.FirstOrDefault(t => t.ID_OPER.Equals(id));
            operador.PERFISReference.Load();
            operador.PESSOASReference.Load();

            return View(operador);
        }

        public ActionResult Edit(Int32? id)
        {
            OPERADORES operador;
            if (id == null)
            {
                operador = new OPERADORES();
                operador.PESSOAS = new PESSOAS();

                ViewData["ID_PERF"] = new SelectList(db.PERFIS, "ID_PERF", "DESC_PERF");

                return View(operador);
            }

            operador = db.OPERADORES.FirstOrDefault(t => t.ID_OPER == id);
            ViewData["ID_PERF"] = new SelectList(db.PERFIS, "ID_PERF", "DESC_PERF", operador.PERFIS.ID_PERF);

            return View(operador);
        }

        [HttpPost]
        public ActionResult Edit(Int32? id, FormCollection form)
        {
            List<String> erros = new List<string>();

            if (string.IsNullOrEmpty(form["NOME_PESSOA"]))
                erros.Add("É necessário informar o nome do operador.");

            if (string.IsNullOrEmpty(form["FANTASIA_PESSOA"]))
                erros.Add("É necessário informar o apelido do operador.");

            if (!erros.Any())
            {
                try
                {
                    OPERADORES operador;
                    PESSOAS pessoa;
                    Int32 ID_PERF = Int32.Parse(form["ID_PERF"]);

                    if (id == null)
                    {                       
                        pessoa = new PESSOAS();
                        pessoa.NOME_PESSOA = form["NOME_PESSOA"];
                        pessoa.TIPO_PESSOA = "F";

                        db.AddToPESSOAS(pessoa);
                        db.SaveChanges();

                        operador = new OPERADORES();
                        operador.DATACAD_OPER = DateTime.Now;
                        operador.PESSOAS = pessoa;
                        
                        db.AddToOPERADORES(operador);
                    }
                    else
                    {
                        operador = db.OPERADORES.FirstOrDefault(t => t.ID_OPER == id);
                    }

                    operador.ATIVO_OPER = form["ATIVO_PESSOA"].Contains("true") ? "A" : "B";
                    operador.COD_OPER = form["COD_OPER"];
                    operador.PERFIS = db.PERFIS.FirstOrDefault(t => t.ID_PERF == ID_PERF);
                    operador.PESSOAS.NOME_PESSOA = form["NOME_PESSOA"];
                    operador.PESSOAS.FANTASIA_PESSOA = form["FANTASIA_PESSOA"];
                    operador.PESSOAS.TIPO_PESSOA = "F";
                    operador.PESSOAS.OBS_PESSOA = form["OBS_PESSOA"];
                    operador.PESSOAS.NASCIMENTO_PESSOA = string.IsNullOrEmpty(form["NASCIMENTO_PESSOA"]) ? null : (DateTime?)DateTime.Parse(form["NASCIMENTO_PESSOA"]);

                    db.SaveChanges();

                    return RedirectToAction("Details", new { id = operador.ID_OPER });
                }
                catch (Exception ex)
                {
                    erros.Add(ex.Message);
                    if (ex.InnerException != null)
                        erros.Add(ex.InnerException.Message);
                }
            }

            return Json(erros, JsonRequestBehavior.AllowGet);
        }

        public ActionResult Delete(Int32 id)
        {
            return View();
        }

        [HttpPost]
        public ActionResult Delete(Int32 id, HttpRequestBase collection)
        {
            try
            {
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        public ActionResult LojasCount()
        {
            return Json(new OperadoresModel().Lojas(), JsonRequestBehavior.AllowGet);
        }

        // Monta a lista de tipos de produtos
        public JsonResult Lojas(String sidx, String sord, Int32 page, Int32 rows, Boolean _search, String searchField, String searchOper, String searchString, Int32 ID_OPER)
        {
            try
            {
                var q = from c in db.LOJAS_OPERADOR
                        where c.OPERADORES.ID_OPER == ID_OPER
                        select new
                        {
                            act = "",
                            c.ID_LJOP,
                            c.LOJAS.COD_LOJA,
                            c.LOJAS.NOME_LOJA
                        };

                JQGridBuilder jbuilder = new JQGridBuilder(q.AsQueryable(), page, sidx, sord, searchField, searchString, searchOper, "ID_LJOP", _search, rows);

                return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json(null, JsonRequestBehavior.AllowGet);
            }
        }

        public ActionResult LojaUpdate()
        {
            return PartialView();
        }

        [HttpPost]
        public ActionResult LojaUpdate(Int32 ID_OPER, Int32 COD_LOJA)
        {
            List<string> erros = new List<string>();

            if (db.LOJAS_OPERADOR.Any(t => t.OPERADORES.ID_OPER == ID_OPER && t.LOJAS.COD_LOJA == COD_LOJA))
            {
                erros.Add("Loja já cadastrada para este operador.");
            }

            if (!erros.Any())
            {
                try
                {
                    db.AddToLOJAS_OPERADOR(new LOJAS_OPERADOR
                    {
                        OPERADORES = db.OPERADORES.FirstOrDefault(t => t.ID_OPER == ID_OPER),
                        LOJAS = db.LOJAS.FirstOrDefault(t => t.COD_LOJA == COD_LOJA)
                    });
                    db.SaveChanges();

                    return Json(new { result = true }, JsonRequestBehavior.AllowGet);
                }
                catch (Exception ex)
                {
                    erros.Add(ex.Message);
                    if (ex.InnerException != null)
                        erros.Add(ex.InnerException.Message);
                }
            }

            return Json(new { result = false, erros = erros }, JsonRequestBehavior.AllowGet);
        }

        public ActionResult LojaDelete(Int32 id)
        {
            List<string> erros = new List<string>();

            try
            {
                db.DeleteObject(db.LOJAS_OPERADOR.FirstOrDefault(t => t.ID_LJOP == id));
                db.SaveChanges();

                return Json(new { result = true }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
                if (ex.InnerException != null)
                    erros.Add(ex.InnerException.Message);
            }

            return Json(new { result = false, erros = erros }, JsonRequestBehavior.AllowGet);
        }
    }
}
